home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / special.c < prev    next >
Text File  |  1996-05-27  |  13KB  |  679 lines

  1. /*
  2.  * special.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Fonctions sp‚ciales d'int‚rˆt g‚n‚ral
  7.  * c'est-…-dire qui auraient du figurer dans les librairies 
  8.  * standard...
  9.  *
  10.  * History:
  11.  * --------
  12.  * 1993: fplanque: Created
  13.  */
  14.  
  15.  
  16.      #include "!OPTIONS.H"                /* Options de compilation */         
  17.     #define    THIS_FILE    "SPECIAL.C v2.00 - 03.95"
  18.           
  19.  
  20. /*
  21.  * System headers:
  22.  */
  23.     #include    <stdio.h>            /* Pour PUTCHAR */
  24.     #include <aes.h>
  25.    #include    <string.h>
  26.  
  27. /*
  28.  * Custom headers:
  29.  */
  30.     #include    "SPEC_PU.H"    
  31.     #include "S_MALLOC.H"
  32.  
  33. /*
  34.  * ------------------------ PROTOTYPES -------------------------
  35.  */
  36.  
  37.  
  38.  
  39. /*
  40.  * ------------------------ VARIABLES -------------------------
  41.  */
  42.     
  43.     
  44. /*
  45.  * Public variables: 
  46.  */
  47.     char    *    G_empty_string = "";            /* Chaine vide */
  48.     char    *    G_crlf = "\r\n";                /* Retour … la ligne */
  49.     void    *    G_null = NULL;
  50.  
  51.     char    *    G_tmp_buffer;                    /* Peut contenir un texte long de 511 signes + '\0' */
  52.     char    *    G_2nd_buffer;                    /* 2Šme buffer */
  53.  
  54.  
  55. /*
  56.  * ------------------------ FUNCTIONS -------------------------
  57.  */
  58.  
  59. /*
  60.  * ctrl_IntRange(-)
  61.  *
  62.  * Purpose:
  63.  * --------
  64.  * inits
  65.  *
  66.  * History:
  67.  * --------
  68.  * 14.01.95: fplanque: Created
  69.  */
  70. void    Special_Init( void )
  71. {
  72.     
  73.     /*
  74.      * Tampon interm‚diaire: 
  75.      */
  76.     G_tmp_buffer = (char *) MALLOC( TMP_BUFFER_SIZE+1 );
  77.     G_2nd_buffer = (char *) MALLOC( SECOND_BUFFER_SIZE+1 );
  78.  
  79. }
  80.  
  81.  
  82.  
  83. /*
  84.  * ctrl_IntRange(-)
  85.  *
  86.  * Purpose:
  87.  * --------
  88.  * Contr“le qu'un INT est bien compris dans l'intervale d‚sir‚
  89.  *
  90.  * History:
  91.  * --------
  92.  * 12.03.94: fplanque: Created
  93.  */
  94. int    ctrl_IntRange(                /* Out: Valeur ds intervale */
  95.             int    n_Value,            /* In:  Valeur d'origine */
  96.             int    n_Minimum,        /* In:  Valeur Minimale autoris‚e */
  97.             int    n_Maximum )        /* In:  Valeur Maximale autoris‚e */
  98. {
  99.     if( n_Value < n_Minimum )
  100.     {
  101.         return    n_Minimum;
  102.     }
  103.     else if( n_Value > n_Maximum )
  104.     {
  105.         return    n_Maximum;
  106.     }
  107.  
  108.     return    n_Value;
  109. }
  110.  
  111.  
  112. /*
  113.  * wait(-)
  114.  *
  115.  * Purpose:
  116.  * --------
  117.  * attend un certain nbre de 100Šmes de seconde
  118.  *
  119.  * History:
  120.  * --------
  121.  * 30.09.94: fplanque: Created
  122.  */
  123. void    wait(
  124.             clock_t    delay )    /* In: d‚lai d'attente en 100Šmes de seconde */
  125. {
  126.     clock_t    ct_end = clock() + delay * CLK_TCK / 100;
  127.  
  128.     while( clock() < ct_end );
  129. }
  130.  
  131.  
  132. /*
  133.  * min(-)
  134.  *
  135.  * Purpose:
  136.  * --------
  137.  * Minimum de deux INT
  138.  *
  139.  * History:
  140.  * --------
  141.  * fplanque: Created
  142.  */
  143. int    min(            /* Out: Minimum des deux INT */
  144.             int a,    /* In:  INT #1 */
  145.             int b)    /* In:  INT #2 */
  146. {
  147.     return( a<b?a:b );
  148. }
  149.  
  150.  
  151. /*
  152.  * l_min(-)
  153.  *
  154.  * Purpose:
  155.  * --------
  156.  * Minimum de deux LONG INT
  157.  *
  158.  * History:
  159.  * --------
  160.  * fplanque: Created
  161.  */
  162. long    l_min(        /* Out: Minimum des deux LONG INT */
  163.             long a,    /* In:  LONG INT #1 */
  164.             long b)    /* In:  LONG INT #2 */
  165. {
  166.     return( a<b?a:b );
  167. }
  168.  
  169. /*
  170.  * max(-)
  171.  *
  172.  * Purpose:
  173.  * --------
  174.  * Maximum de deux INT
  175.  *
  176.  * History:
  177.  * --------
  178.  * fplanque: Created
  179.  */
  180. int    max(            /* Out: Maximum des deux INT */
  181.             int a,    /* In:  INT #1 */
  182.             int b)    /* In:  INT #2 */
  183. {
  184.     return( a<b?b:a );
  185. }
  186.  
  187.  
  188. /*
  189.  * l_max(-)
  190.  *
  191.  * Purpose:
  192.  * --------
  193.  * Maximum de deux LONG INT
  194.  *
  195.  * History:
  196.  * --------
  197.  * fplanque: Created
  198.  */
  199. long    l_max(        /* Out: Maximum des deux LONG INT */
  200.             long a,    /* In:  LONG INT #1 */
  201.             long b)    /* In:  LONG INT #2 */
  202. {
  203.     return( a<b?b:a );
  204. }
  205.  
  206.  
  207.  
  208.  
  209. /*
  210.  * rcintersect(-)
  211.  *
  212.  * Purpose:
  213.  * --------
  214.  * Calcule le rectangle resultant de l'intersection de deux
  215.  * rectangles
  216.  *
  217.  * Algorythm:
  218.  * ----------  
  219.  * Calcule bas-droite intersection
  220.  * Calcule haut-gauche intersection
  221.  * Calcule largeur/hauteur intersection
  222.  * Vérifie qu'il y a eu intersection
  223.  *
  224.  * Notes:
  225.  * ------
  226.  * Toutes coordonnées transmises par variables séparées
  227.  * Une autre fonction plus efficace effectue une transmission par GRECT
  228.  *
  229.  * History:
  230.  * --------
  231.  *     1993: fplanque: Created             
  232.  * 29.04.94: fplanque: Modifié vérification intersection
  233.  */
  234. int    rcintersect(         /* Out: !=0 s'il y a eu intersection */
  235.             int area_x,    /* In: Premier rectangle */
  236.             int area_y, 
  237.             int area_w, 
  238.             int area_h,
  239.             int *box_x,     /* In/Out: Deuxième rectangle/Rectangle intersection */
  240.             int *box_y, 
  241.             int *box_w, 
  242.             int *box_h )
  243. {
  244.     int    tw, th;
  245.     
  246.     /*
  247.      * Calcule coordonnées inférieures droites de l'intersection
  248.      */
  249.     tw= min( *box_x+*box_w, area_x+area_w );
  250.     th= min( *box_y+*box_h, area_y+area_h );
  251.  
  252.     /*
  253.      * Calcule coordonnées supérieurs gauches de l'intersection
  254.      */
  255.     *box_x= max( *box_x, area_x );
  256.     *box_y= max( *box_y, area_y );
  257.     
  258.     /*
  259.      * Calcule dimensions de l'intersection
  260.      */
  261.     *box_w= tw - *box_x;
  262.     *box_h= th - *box_y;
  263.     
  264.     /*
  265.      * Détermine s'il y a intersection
  266.      */
  267.     return ( (*box_w > 0) && (*box_h > 0) );
  268. }
  269.  
  270.  
  271. /*
  272.  * grcintersect(-)
  273.  *
  274.  * Purpose:
  275.  * --------
  276.  * Calcule le rectangle resultant de l'intersection de deux
  277.  * rectangles
  278.  *
  279.  * Algorythm:
  280.  * ----------  
  281.  * Calcule bas-droite intersection
  282.  * Calcule haut-gauche intersection
  283.  * Calcule largeur/hauteur intersection
  284.  * V‚rifie qu'il y a eu intersection
  285.  *
  286.  * History:
  287.  * --------
  288.  *     1993: fplanque: Created             
  289.  * 29.04.94: fplanque: Modifié vérification intersection
  290.  */
  291. int    grcintersect(        /* Out: !=0 s'il y a eu intersection */
  292.             GRECT *area,   /* In: Premier rectangle */
  293.             GRECT *box )   /* In/Out: Deuxième rectangle/Rectangle intersection */
  294. {
  295.     int    tw, th;
  296.     
  297.     /*
  298.      * Calcule coordonnées inférieures droites de l'intersection
  299.      */
  300.     tw= min( box->g_x+box->g_w, area->g_x+area->g_w );
  301.     th= min( box->g_y+box->g_h, area->g_y+area->g_h );
  302.  
  303.     /*
  304.      * Calcule coordonnées supérieurs gauches de l'intersection
  305.      */
  306.     box->g_x= max( box->g_x, area->g_x );
  307.     box->g_y= max( box->g_y, area->g_y );
  308.     /*
  309.      * Calcule dimensions de l'intersection
  310.      */
  311.     box->g_w= tw - box->g_x;
  312.     box->g_h= th - box->g_y;
  313.     
  314.     /*
  315.      * D‚termine s'il y a intersection
  316.      */
  317.     return ( (box->g_w > 0) && (box->g_h > 0) );
  318. }
  319.                                   
  320.                                   
  321. /*
  322.  * grecttoarray(-)
  323.  *
  324.  * Purpose:
  325.  * --------
  326.  * Remplit un (morceau de) tableau d'int
  327.  * avec les champs d'un GRECT
  328.  *
  329.  * History:
  330.  * --------
  331.  * fplanque: Created
  332.  */
  333. void    grecttoarray( 
  334.             GRECT *rect,      /* In: GRECT à transcrire */
  335.             int *array )    /* Buffer: Tableau dans lequel il faut écrire */
  336. {
  337.     array[0] = rect -> g_x;
  338.     array[1] = rect -> g_y;
  339.     array[2] = rect -> g_x + rect -> g_w -1;
  340.     array[3] = rect -> g_y + rect -> g_h -1;
  341.     
  342. }
  343.  
  344.  
  345. /*
  346.  * ping(-)
  347.  *
  348.  * Purpose:
  349.  * --------
  350.  * Fait ping/beeep/tut selon l'ordinateur
  351.  *
  352.  * Algorythm:
  353.  * ----------  
  354.  * Imprime un caractŠre de code ASCII 7 sur la console
  355.  *
  356.  * Notes:
  357.  * ------
  358.  * Utilisé pour signaler les erreurs i-e les situations imprévues
  359.  * dans le code. Ne devrait pratiquement jamais se produire en temps
  360.  * normal. Pour les bips normaux, on devrait utilisé quelque chose
  361.  * de plus sophistiqué!
  362.  *
  363.  * History:
  364.  * --------
  365.  * fplanque: Created
  366.  */
  367. void    ping ( void )
  368. {
  369.     putchar('\a');
  370. }
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377. /*
  378.  * Sstrcmp(-)
  379.  *
  380.  * Compare deux chaines mais s'arrˆte sur un caractŠre sp‚cial:
  381.  *
  382.  * 12.01.95: fplanque: created
  383.  */
  384. int    Sstrcmp(
  385.             const    char * cpsz_1,
  386.             const    char * cpsz_2,
  387.             char             c_spec )    /* In: CaractŠre de fin */
  388. {
  389.     int    difference;
  390.     
  391.     for( ; ; )
  392.     {
  393.         if( *cpsz_1 == c_spec || *cpsz_1 == '\0' )
  394.         {    
  395.             if( *cpsz_2 == c_spec || *cpsz_2 == '\0' )
  396.             {    /* 1 = 2 */
  397.                 return    0;
  398.             }
  399.             
  400.             /* 1 < 2 */
  401.             return    -1;
  402.         }
  403.             
  404.         
  405.         if( *cpsz_2 == c_spec || *cpsz_2 == '\0' )
  406.         {    /* 1 > 2 */
  407.             return 1;
  408.         }
  409.  
  410.         if( (difference = *(cpsz_1++) - *(cpsz_2++)) !=0 )
  411.         {
  412.             return    difference;
  413.         }
  414.     }
  415. }
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423. /*
  424.  * strBchr(-)
  425.  *
  426.  * Purpose:
  427.  * --------
  428.  * String BACK-char
  429.  * Cherche un caractŠre depuis la fin de la chaine/
  430.  *
  431.  * Algorythm:
  432.  * ----------  
  433.  * En fait il parcourt la chaine … l'endroit mais jusqu'au bout!
  434.  * Car pour commencer par la fin, il faudrait déjà chercher la fin!
  435.  *
  436.  * Notes:
  437.  * ------
  438.  *
  439.  * History:
  440.  * --------
  441.  * 1993: fplanque: Created
  442.  */
  443. char    *strBchr(
  444.             char *string,     /* In: ChaŒne dans laquelle il faut chercher */
  445.             char chr )         /* In: CaractŠre … rechercher */
  446. {
  447.     char    *found_pos = NULL;    /* Pour l'instant, on n'a rien trouv‚! */
  448.  
  449.     do
  450.     {
  451.         if ( *string == chr )
  452.         { /*
  453.             * Si on a trouv‚ une it‚ration du CHR recherch‚: 
  454.             */
  455.             found_pos = string;                /* On la note */
  456.         }
  457.         
  458.     } while( *(string++) != '\0' );        /* Tant qu'on a pas atteint le '\0' final */ 
  459.  
  460.     return    found_pos;    /* Retourne pos de la derniŠre it‚ration trouv‚e */
  461. }
  462.  
  463.  
  464. /*
  465.  * replace_extension(-)
  466.  *
  467.  * Purpose:
  468.  * --------
  469.  * Remplace l'extension d'un nom de fichier par celle voulue
  470.  *
  471.  * Notes:
  472.  * ------
  473.  * Pas d'alloc m‚moire: le nom sur lequel on opŠre doit comporter la place n‚cessaire … l'op‚ration
  474.  *
  475.  * History:
  476.  * --------
  477.  * 12.11.94: fplanque: Created
  478.  */
  479. void    replace_extension(
  480.             char *             pBsz_FileName,        /* In: Buffer contenant Nom sur lequel on opŠre */
  481.             const char *    cpsz_Extension )    /* In: Extension … utiliser */
  482. {            
  483.     char * piBsz_Point = strBchr( pBsz_FileName, '.' );
  484.  
  485.     if( piBsz_Point == NULL )
  486.     {    /*
  487.          * Pas trouv‚: ahoute extension:
  488.          */
  489.         strcat( pBsz_FileName, cpsz_Extension );
  490.     }
  491.     else
  492.     {    /*
  493.          * Trouv‚: remplace par nlle extension:
  494.          */
  495.         strcpy( piBsz_Point, cpsz_Extension ); 
  496.     }
  497.  
  498. }
  499.  
  500. /* 
  501.  * ----------------------- Gestion de chaines ------------------------
  502.  */
  503.  
  504.  
  505. /*
  506.  * dup_String(-)
  507.  *
  508.  * Purpose:
  509.  * --------
  510.  * Duplique une chaine de caractŠres
  511.  *
  512.  * Algorythm:
  513.  * ----------  
  514.  * Tient compte du cas ou le pointeur est 
  515.  * NULL ou encore egal … G_empty_string
  516.  *
  517.  * Notes:
  518.  * ------
  519.  *
  520.  *
  521.  * History:
  522.  * --------
  523.  * 21.09.94: fplanque: Created
  524.  * 14.11.94: parametre est maintenant const
  525.  * 04.12.94: vorrection bug: && -> ||
  526.  */
  527. char * dup_String(                             /* Out: Copie */
  528.                 const char * psz_Src )        /* In: Source */
  529. {
  530.     if( psz_Src == NULL || psz_Src == G_empty_string )
  531.     {
  532.         /* printf( "\nduplication string vide" ); */
  533.         return    (char*) psz_Src;        /* unCONST !! */
  534.     }
  535.     else
  536.     {
  537.         /* printf( "\nduplication de [%s]", psz_Src ); */
  538.         return    STRDUP( psz_Src );
  539.     }
  540.  
  541. }
  542.  
  543.  
  544. /*
  545.  * free_String(-)
  546.  *
  547.  * Purpose:
  548.  * --------
  549.  * Efface une chaine dont on fournit un pointeur
  550.  *
  551.  * Algorythm:
  552.  * ----------  
  553.  * Tient compte du cas ou le pointeur est 
  554.  * NULL ou encore egal … G_empty_string
  555.  *
  556.  * Notes:
  557.  * ------
  558.  *
  559.  *
  560.  * History:
  561.  * --------
  562.  * 24.05.94: fplanque: Created
  563.  */
  564. void    free_String(
  565.             char    * pString )    /* In: ptr sur chaine … effacer */
  566. {
  567.     if( pString != NULL && pString != G_empty_string )
  568.     {
  569.         FREE( pString );
  570.     }
  571. }
  572.  
  573.  
  574. /*
  575.  * len_String(-)
  576.  *
  577.  * Purpose:
  578.  * --------
  579.  * Donne lg d'une chaine dont on fournit un pointeur
  580.  *
  581.  * Algorythm:
  582.  * ----------  
  583.  * Tient compte du cas ou le pointeur est NULL
  584.  *
  585.  * History:
  586.  * --------
  587.  * 24.03.95: fplanque: Created
  588.  */
  589. size_t    len_String(
  590.                 const char    * pString )    /* In: ptr sur chaine … effacer */
  591. {
  592.     if( pString != NULL )
  593.     {
  594.         return strlen( pString );
  595.     }
  596.     
  597.     return 0;
  598. }
  599.  
  600.  
  601. /*
  602.  * copy_String(-)
  603.  *
  604.  * Purpose:
  605.  * --------
  606.  * Copie une chaine dont on fournit un pointeur
  607.  *
  608.  * Algorythm:
  609.  * ----------  
  610.  * Tient compte du cas ou le pointeur est NULL
  611.  *
  612.  * History:
  613.  * --------
  614.  * 29.03.95: fplanque: Created
  615.  */
  616. void    copy_String(
  617.                 char            * pString_Dest,    /* In: ptr sur buffer destination */
  618.                 const char    * cpString_Srce )    /* In: ptr sur chaine … effacer */
  619. {
  620.     if( cpString_Srce != NULL )
  621.     {
  622.         strcpy( pString_Dest, cpString_Srce );
  623.     }
  624.     else
  625.     {
  626.         pString_Dest[0]='\0';    
  627.     }
  628. }
  629.  
  630.  
  631. /*
  632.  * freeOld_dupString(-)
  633.  *
  634.  * Purpose:
  635.  * --------
  636.  * Duplique une chaine et sauve le ptr … un emplacement
  637.  * que l'on prend soin de vider au pr‚alable
  638.  * il s'agit d'un REMPLACEMENT
  639.  *
  640.  * Algorythm:
  641.  * ----------  
  642.  * Tient compte du cas ou le pointeur est 
  643.  * NULL ou encore egal … G_empty_string
  644.  *
  645.  *
  646.  * History:
  647.  * --------
  648.  * 14.11.94: fplanque: Created
  649.  */
  650. void    freeOld_dupString(
  651.             char        * * ppsz_Dest,        /* In/Out: Adr du Ptr destination */
  652.             const char * psz_Srce )        /* In: Chaine … dupliquer */
  653. {
  654.     free_String( * ppsz_Dest );
  655.     * ppsz_Dest = dup_String( psz_Srce );
  656. }
  657.  
  658.  
  659. /*
  660.  * realloc_String(-)
  661.  *
  662.  * Reallocation d'une chaine avec une nouvelle taille
  663.  * Gestion du cas ou la source est NULL
  664.  *
  665.  * 10.07.95: fplanque: Created
  666.  */
  667. char * realloc_String(                /* Out: Nouvelle chaine */
  668.             const char * pMsz_src,    /* In:  Chaine source */
  669.             size_t         size_new )    /* In:  Nouvelle longueur */
  670. {
  671.     if( pMsz_src == NULL )
  672.     {
  673.         return    (char*)MALLOC( size_new );
  674.     }
  675.     else
  676.     {
  677.         return    (char*)REALLOC( pMsz_src, size_new ); 
  678.     }
  679. }